package com.demo.java.OD501_550.OD543;

import java.util.*;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【执行任务赚积分(C卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146513425
 */
public class OdMain {
    public static void main(String[] args) {
        // 创建Scanner对象以获取输入
        Scanner in = new Scanner(System.in);

        // 读取任务数N和时间限制T
        int N = in.nextInt();
        int T = in.nextInt();

        // 创建二维数组存储每个任务的截止时间和积分
        int[][] tasks = new int[N][2];

        // 读取每个任务的截止时间和积分值
        for (int i = 0; i < N; i++) {
            int sla = in.nextInt();  // 截止时间
            int V = in.nextInt();    // 积分
            tasks[i][0] = sla;
            tasks[i][1] = V;
        }

        // 按照截止时间对任务进行排序
        Arrays.sort(tasks, (o1, o2) -> o1[0] - o2[0]);

        // 初始化最大积分和任务队列
        int max_score = 0;
        PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> a - b);

        // 当前时间
        int time1 = 0;

        int i = 0;
        // 执行任务的循环
        while (true) {
            if (i >= N) {
                // 如果所有任务都执行完，检查队列大小是否超过了时间限制T
                while (queue.size() > T) {
                    // 移除队列中积分最低的任务
                    max_score -= queue.peek();
                    queue.poll();
                }
                // 输出最大积分
                System.out.print(max_score);
                break;
            } else {
                // 如果当前时间小于任务的截止时间，则执行当前任务
                if (time1 < tasks[i][0]) {
                    queue.offer(tasks[i][1]);  // 将任务的积分加入队列
                    time1 += 1;  // 增加时间
                    max_score += tasks[i][1];  // 增加当前任务的积分
                } else {
                    // 如果当前时间已经过了任务的截止时间，且队列中有任务
                    if (queue.size() > 0) {
                        int top = queue.peek();  // 获取队列中积分最小的任务
                        // 如果当前任务的积分更高，替换积分最小的任务
                        if (tasks[i][1] > top) {
                            queue.poll();  // 移除积分最小的任务
                            queue.offer(tasks[i][1]);  // 添加当前任务
                            max_score += tasks[i][1] - top;  // 更新积分
                        }
                    }
                }
            }
            i += 1;  // 继续处理下一个任务
        }
    }

    // 将输入的字符串分割成整数数组
    public static int[] split(String input_str) {
        String[] tmp2 = input_str.split(",");
        int[] nums = new int[tmp2.length];
        for (int i = 0; i < tmp2.length; i++) {
            nums[i] = Integer.parseInt(tmp2[i]);
        }
        return nums;
    }
}
